home *** CD-ROM | disk | FTP | other *** search
/ PCMania 73 / PCMania CD73_1.iso / pcmania / render73 / Taller / castli17 / CASTLE20.INC < prev    next >
Text File  |  1998-01-04  |  52KB  |  1,495 lines

  1. /* Este fichero es la versión 2.0 de Castlib: una libreria de formas para la
  2.    creación  de  castillos  con  POV  3.0.   La  presente  versión  de  este
  3.    "producto" puede ser utilizada libremente por cualquiera, pero dicho  uso
  4.    implica la aceptación de las siguientes condiciones:
  5.    1) Si alguien emplea alguna de las  estructuras  de  Castlib  2.0  debera
  6.    indicarlo  asi  al  principio  de  su fichero escenico citando tambien el
  7.    nombre de su autor.
  8.    2) Si alguien realiza alguna modificación sobre los ficheros que componen
  9.    Castlib 2.0, debera citar el producto original y su procedencia e indicar
  10.    que lo utilizado es una mutación de Castlib.
  11.    3) Este producto no es shareware sino de PAGO.  Si lo  utilizas  y  algun
  12.    dia, casualmente o no, topas con el autor de Castlib, quedaras obligado a
  13.    invitar a dicho autor a  una caña mientras le explicas como has utilizado
  14.    su producto.
  15.    4)  El  autor  rechaza  cualquier  responsabilidad por cualquier desastre
  16.    informatico, neurologico, o de  cualquier  otro  tipo  que el uso de este
  17.    producto pudiera ocasionar a cualquier ser  pensante  con  una  capacidad
  18.    mental  superior a la de una piedra.  Se entiende asimismo que el usuario
  19.    renuncia a cualquier pretensión de  reclamación, ahora y siempre, en este
  20.    o en cualquier otro universo (paralelo o no), sin excepción  espacial  ni
  21.    temporal, y liberando al autor en parte y en todo de cualquier obligación
  22.    futura.
  23.    5)  La  clausula  4  tambien  se  aplica  a  las entidades integrantes de
  24.    cualquier universo o entorno  virtual  simulado  en cualquier sistema con
  25.    capacidad de procesamiento superior al de un abaco.
  26.    6)  El  uso  de este producto y el incumplimiento de estas clausulas sera
  27.    castigado con medidas judiciales y ostracismo en PCmania. */
  28.  
  29. #include "shapes.inc"
  30. #include "colors.inc"
  31. #include "textures.inc"
  32. #include "woods.inc"
  33. #include "metals.inc"
  34.  
  35. /* castle20.inc  comienza  definiendo  las  estructuras  de  mas  bajo nivel
  36.    necesarias para la construcción de castillos, o sea:  puertas,  ventanas,
  37.    almenas,  etc.  Luego siguen objetos de "mayor nivel" como muros, torres,
  38.    etc,  que  emplean  los  elementos  simples  ya  definidos.   Siguira  la
  39.    definición  de  construcciones  mas  complejas;  grupos  de  torres, alas
  40.    enteras del castillo, etc.  Finalmente la definición de la escena,  donde
  41.    se  indican  las estructuras empleadas, su posición, la camara, etc, esta
  42.    en el fichero .pov de cada escena.
  43.    Las unidades empleadas son decimetros */
  44.    
  45. #declare textmur1 = texture{    // piedra de los componentes de las casas
  46. //      pigment{image_map{tga "piedra3.tga" }}
  47. pigment{Orange}
  48. }
  49. #declare textmur2 = texture{    // piedra de castillo
  50. //      pigment{image_map{tga "textur2.tga"}}
  51. pigment{Orange}
  52. }
  53. #declare texcastle= texture{    //piedra de muro de castillo
  54. /*    pigment{image_map{tga "text1.tga" map_type 0} scale <14,14,1>}
  55.     finish {
  56.         ambient 0.10
  57.         diffuse 1
  58.         } */
  59. pigment{Orange}
  60. }
  61. #declare texcastle1= texture{   //piedra multicolor de las casas
  62. //    pigment{image_map{tga "piedras2.tga" map_type 0}} 
  63. /*    pigment{image_map{tga "piedras3.tga" map_type 0}} 
  64.     finish {
  65.         ambient 0.10
  66.         diffuse 1
  67.         }
  68.     translate <-.5,-.5,0> scale <14,14,1> */
  69. pigment{Orange}
  70. }
  71. // piedra usada para techos de torre, escaleras y otros elementos sueltos
  72. #declare texcastle2= texture{
  73. /*    pigment{image_map{tga "piedra22.tga" map_type 0} scale <14,14,1>}
  74.     finish {
  75.         ambient 0.10
  76.         diffuse 1
  77.         } */
  78. pigment{Orange}
  79. }
  80.  
  81. #declare T17 = texture { T_Wood17 }
  82.  
  83. // Aqui estan las construcciones de puertas y ventanas normales
  84. // siguen las construcciones utilizadas como marcos de ventanas y puertas
  85. #declare marcopi=prism{linear_sweep
  86.     linear_spline
  87.     0,10
  88.     60,
  89.     <-10,-20>, <-10,-14.10>, <-15,-14.10>,
  90.     <-16,-15>, <-16,-19>, <-15,-20>, <-10,-20>
  91.  
  92.     <-10,-13.90>, <-10,-8>, <-11,-7.10>, <-16,-7.10>,
  93.     <-17,-8>, <-18,-11>, <-17,-13>, <-15,-13.90>, <-10,-13.90>
  94.  
  95.     <-10,-6.90>, <-10,-.10>, <-14,-.10>, <-16,-2>,
  96.     <-16,-5>, <-15,-6.90>, <-10,-6.90>
  97.  
  98.     <-10,.10>, <-10,6.90>, <-15,6.90>, <-16,5>,
  99.     <-16,3>, <-15,1>, <-14,.10>, <-10,.10> 
  100.  
  101.     <-10,7.10>, <-10,12.90>, <-15,13.50>, <-16,11>,
  102.     <-16,9>, <-15,7.10>, <-10,7.10>
  103.  
  104.     <-10,13.10>, <-9,15.90>, <-8,17.90>, <-12,19.90>,
  105.     <-15,17.90>, <-16,14>, <-15,13.10>, <-10,13.10>
  106.  
  107.     <-7.90,18.10>, <-7,19>, <-6,19.40>, <-4.10,20>,
  108.     <-7,25>, <-11,24>, <-12,22>, <-12.20, 20.10>, <-7.90,18.10>
  109.  
  110.     <-3.90,20>, <-.10,20>, <-.10,27>, <-7,26>, <-3.90,20>
  111. // la siguiente ristra de transformaciones deja el marco sobre el suelo
  112.     translate<0,-5,-3> rotate x*-90 scale<.5,.5,1> translate<0,11.50,0>
  113.     }
  114.  
  115. #declare marcopd=object {marcopi rotate y*180}
  116.  
  117. #declare fbpuer1=union{
  118.     intersection{
  119.         cylinder{<0,-1,0>,<0,1,0>,5 rotate x*90 translate<0,15.5,0>}
  120.         plane{x,15.5}
  121.         }
  122.     box{<-5,0,-1>,<5,15.5,1>}
  123.     texture{textmur1 rotate y*45 rotate x*45}
  124.     }
  125.  
  126. #declare marcopu=difference{
  127.     union{
  128.         object {marcopi}
  129.         object {marcopd}
  130.         }
  131.     object{fbpuer1 scale<1.1,1,6>}
  132.     texture{textmur1 rotate y*45 rotate x*45}
  133.     }
  134.     
  135. // recorte de esta puerta para muros o torres
  136. #declare recpuer1=object{fbpuer1 scale<1.1,1,15>
  137.     texture{textmur1 rotate y*45 rotate x*45}
  138. }
  139.  
  140. #declare hierrop=union{
  141.     difference{
  142.         object{fbpuer1 translate<0,-10.25,0> scale<1,1,1.33> texture{T_Copper_1A}}
  143.         object{fbpuer1 translate<0,-10.25,0> scale<.85,.90,2> texture{T_Copper_1A}}
  144.         translate<0,10.25,0> 
  145.         }
  146.     intersection{
  147.         object{fbpuer1 translate<0,-10.25,0> scale<1,1,1.33> 
  148.                translate<0,10.25,0> texture{T_Copper_1A}}
  149.         union{
  150.             box{<-20,5,-4>,<20,6,4>}  //hierros horizontales de puerta
  151.             box{<-20,10,-4>,<20,11,4>}
  152.             box{<-20,15,-4>,<20,16,4>}
  153.             texture{T_Copper_1A}}
  154.         }
  155. //    texture{T_Copper_1A}
  156.     }
  157.  
  158. #declare puerta=union{
  159.     object{marcopu}
  160.     object{fbpuer1 texture{T17 scale<10,10,10> rotate x*90}}
  161.     object{hierrop scale<1.05,1,1.05>}
  162. // pomo de la puerta
  163.     union{
  164.         sphere {<3.25,10.40,-2>,.50}
  165.         torus {.90,.15 rotate x*90 translate <3.25,9.75,-2>}
  166.         texture{T_Copper_5A}
  167.         }
  168. // la puerta tiene 2.3 *1.80 metros de altura (incluyendo las piedras) el
  169. // ancho es de un metro 
  170. //    bounded_by{box{<-9,0,-5>,<9,23,5>}}
  171.     }
  172.  
  173. #declare marcove1=union{
  174.     difference{
  175.         object{marcopu translate<0,-3,0>}
  176.         plane{y,0}
  177.         translate<0,-10,0> scale<.60,.80,1> translate<0,8,0>
  178.         }
  179. // piedra de la base de la ventana
  180.     superellipsoid { <0.35, 0.35> scale <4.5,1.6,4> translate<0,-.8,-3>}
  181. // barrotes
  182.     union{
  183.           cylinder{<-1.25,0,-2.5>,<-1.25,15,-2.5>,.4}
  184.            cylinder{<1.25,0,-2.5>,<1.25,15,-2.5>,.4}
  185.           cylinder{<-1.25,-4,-2.5>,<-1.25,4,-2.5>,.4 rotate z*90 translate<0,10,0>}
  186.            cylinder{<1.25,-4,-2.5>,<1.25,4,-2.5>,.4 rotate z*90 translate<0,3,0>}
  187.         texture{T_Copper_1A}
  188.         }
  189.     translate<0,1.6,0>
  190.     pigment{Orange}
  191. //      pigment{image_map{tga "piedra3.tga"} rotate x*45 rotate y*45}
  192.     }
  193.  
  194. #declare recven1=object{fbpuer1 translate<0,-8.25,0>
  195.                     scale<.60,.80,1> scale<1.1,1,8> translate<0,8,0>
  196.                     texture{textmur1 rotate y*45 rotate x*45}
  197.                     }
  198.  
  199. // la portilla que va en la cima de las torres
  200. #declare portilla=union{
  201.        difference{
  202.         cylinder{<0,-3,0>, <0,3,0>,5.45}
  203.            cylinder{<0,-4,0>, <0,4,0>,4}
  204.             texture{T_Copper_1A}
  205.         }
  206.        union{
  207.         box{<-5,-3,-.75>,<5,3,.75>}
  208.            box{<-5,-3,-.75>,<5,3,.75> rotate y*90}
  209.            texture{T_Copper_1A}
  210.         }
  211. // pomo de la puerta
  212.        union{
  213.         sphere {<0,3.50,0>,.75 translate <3,0,0>}
  214.            torus {.90,.15 translate <2,3.25,0>}
  215.               texture{T_Copper_5A}
  216.          }
  217.        cylinder{<0,-2.50,0>, <0,2.50,0>,5.45 texture{T17 scale<10,10,10>} }
  218.     translate <0,3.50,0>
  219.     scale<1.50,1,1.50>
  220. }
  221.     
  222. //170 alto (Y), 140 ancho (X) y 1 de grosor. En las coords. dadas, los val.
  223. //de X corresponden pero los de Y corresp. a Z (del plano de dibujo al plano
  224. //3d) (La aspillera queda mirando de frente, centrada en x=0, con suelo y=0)
  225. #declare macroas=union{
  226.     difference {
  227.         prism{  linear_sweep
  228.                 linear_spline
  229.                 0,14
  230.                 7,
  231.                 <0,0>, <2.5,11>, <5,17>, <7.5,17>,
  232.                 <10,11>, <10,0>, <0,0>
  233.              }
  234.         prism{  linear_sweep
  235.                 linear_spline
  236.                 2,12
  237.                 5,
  238.                 <0,0>, <0,11>, <12,6.5>, <12, 4.5>, <0,0>
  239.                 translate<0,-5.5,-6>
  240.                 rotate x*90
  241.                 translate<0,6,5.5>
  242.                 translate<0,.5,0>
  243.               }
  244.         translate <-5,-7,-8.5>  // centrado de la forma
  245.         rotate x*-90
  246.         rotate y*-270
  247.         translate <0,7,0>
  248.     }
  249. }    
  250. #declare lateralas=difference{
  251.     object{macroas}
  252.     box{<-6.9,-10,-20>,<6.9,20,20> }
  253.     scale <1.02,1,1>
  254.     texture{texcastle rotate y*90}
  255. }
  256.  
  257. #declare aspilleraGt= union{
  258.     object {macroas}
  259.     object {lateralas}
  260.     difference {
  261.         box{<-3.5,-10,-5>,<3.5,0,0>}
  262.         plane{ <0,10,0>,0 rotate x*52 translate <0,-10,0>}
  263.                }
  264.     texture{texcastle}
  265. //    pigment{Orange}
  266.     } 
  267.  
  268. // aspilleraG es usada para las torres
  269. #declare aspilleraG= union{
  270.     object{aspilleraGt}
  271.     box{<-14.75,0,-3.5>,<-7,7.5,0>}    
  272.     box{<7,0,-3.5>,<14.75,7.5,0>}    
  273.     texture{texcastle}
  274.     }
  275.  
  276. // esta declaración es empleada en los muros y en algunas torres cuadradas
  277. #declare ristra10=union{
  278.     #declare cal=0
  279. // el valor inicial de xa se debe a que la aspillera esta centrada en 0 y va
  280. //  de -12.50 a 12.50.  50-12.50=37.50  (realmente  va  de 15 a 15 pero este
  281. //  espacio extra se destina  a  que  encajen  los  bloques  en  las  torres
  282. //  cuadradas.   Asi,  si  deseamos  crear  una  ristra  desde -250 a 250 xa
  283. //  comenzara a 250-12.50=237.50.  
  284.     #declare xa=-37.5
  285.     #while(cal!=4)
  286.      object{ aspilleraG translate<xa,0,0>}
  287.      #declare cal=cal+1
  288.      #declare xa=xa+25
  289.     #end
  290.     }
  291.  
  292. // EJEMPLOS DE MUROS 
  293. // Este muro tiene 10 metros de alto * 10 de largo y 1.6 de ancho. Esta
  294. // centrado en z=0 y va desde 0 a 100X, de frente al espec. 
  295. #declare muro10_10= union{
  296.     box{<0,0,-8>,<100,100,8>}    
  297.     object{ristra10 translate<50,100,-8>}
  298.     texture{texcastle}
  299.     } 
  300. // sigue el mismo muro con doble longitud
  301. #declare muro10_20= union{
  302.     box{<0,0,-8>,<200,100,8>}    
  303.     object{ristra10 translate<50,100,-8>}
  304.     object{ristra10 translate<150,100,-8>}
  305.     texture{texcastle}
  306.     } 
  307.  
  308. // Puerta Grande. usada para entradas a zonas internas o torres grandes del
  309. // castillo. Tiene 7 metros y medio de altura* 5 de ancho.
  310. // en primer lugar, definimos la forma basica
  311. #declare fbport1=union{
  312.     intersection{
  313.         cylinder{<0,-3,0>,<0,3,0>,25 rotate x*90 translate<0,50,0>}
  314.         plane{x,50}
  315.         }
  316.     box{<-25,0,-3>,<25,50,3>}
  317. //    pigment{Brown}
  318.     }
  319. // recorte para el muro
  320. #declare recport1=object{fbport1 translate<0,-37.5,0>
  321.                          scale<1.02,1.067,4>
  322.                          translate<0,37.5,0>
  323.                          translate<0,-2,0>}
  324. #declare hierropG=union{
  325.     difference{
  326.         object{fbport1 translate<0,-37.5,0> scale<1,1,1.33>}
  327.         object{fbport1 translate<0,-37.5,0> scale<.90,.90,2>}
  328.         translate<0,37.5,0> 
  329.         }
  330.     intersection{
  331.         object{fbport1 translate<0,-37.5,0> scale<1,1,1.33> translate<0,37.5,0>}
  332.         union{
  333.             box{<-40,16,-4>,<40,20,4>}  //hierros horizontales de puerta
  334.             box{<-40,32,-4>,<40,36,4>}
  335.             box{<-40,48,-4>,<40,52,4>}
  336.             box{<-4,0,-4>,<4,100,4>}    //hierro vertical de puerta
  337.             }
  338.         }
  339.     texture{T_Brass_1A}
  340.     }
  341. //batiente izquierda de puerta grande
  342. #declare batizqpG=difference{
  343.     union{
  344.         object{fbport1 texture{T17 scale<10,10,10> rotate x*90}}
  345.         object{hierropG}
  346.         }
  347.     plane{-x,.15}
  348.     }
  349. #declare batidepG=object{batizqpG rotate y*180}
  350. #declare puertaG=union{
  351.     object{batizqpG}
  352.     object{batidepG}
  353.     }
  354.  
  355. // mas EJEMPLOS DE MUROS, ESTA vez con puertas
  356. //otra vez el muro de 10*10, pero ahora con porton de entrada cerrado
  357. #declare muro10_10pc=union{
  358.     difference{
  359.         object{muro10_10}
  360.         object{recport1}
  361.         texture{textmur1}
  362.         }
  363.     object{puertaG}
  364.     }  
  365.  
  366. //otra vez el muro de 10*20, pero ahora con porton de entrada cerrado
  367. #declare muro10_20pc=union{
  368.     difference{
  369.         object{muro10_20}
  370.         object{recport1}
  371.         texture{textmur1}
  372.         }
  373.     object{puertaG}
  374.     }  
  375.  
  376.  
  377. // ESCALERAS
  378. // tramo de escaleras para alcanzar 10 metros de altura. Sube de izq. a
  379. // der., mostrando el lado horizontal al espectador. Tiene 1.8 metros de
  380. // ancho y 9.5 metros de largo. Consta de 50 peldaños
  381. #declare escal10= union{
  382.     #declare pel=0
  383.     #declare alt=4
  384.     #declare xpel=-45
  385.     #while (pel!=50)
  386.         box{<xpel,alt-4,-5>,<45,alt,5>}
  387.         #declare alt=alt+2
  388.         #declare pel=pel+1
  389.         #declare xpel=xpel+1.9
  390.     #end    
  391.     texture{textmur1}
  392. }
  393.         
  394.  
  395. // Torres colgantes.  Estas  estructuras  son  colocadas en las secciones de
  396. // las torres de tierra. Cada una es una unidad completa
  397. // pieza usada para crear el "cilindro" de la torre
  398. #declare piezacil60=difference{
  399.         cylinder{<0,60,0>,<0,100,0>,30 }
  400.         plane{-z,0 rotate y*(30-90)}
  401.         plane{-z,0 rotate -y*(30-90)}
  402.         cylinder{<0,65,0>,<0,120,0>,25}
  403.         texture{texcastle}
  404. }
  405. //"piezahue" es usada para los huecos entre las aspilleras
  406. #declare pieza1=difference{
  407.         cylinder{<0,100,0>,<0,108,0>,34.5 }
  408.         cylinder{<0,90,0>,<0,120,0>,30}
  409.         plane{-z,0 rotate y*(30-90)}
  410.         plane{-z,0 rotate -y*(30-90)}
  411.         texture{texcastle}
  412.         }
  413. #declare pieza2=difference{
  414.         cylinder{<0,108,0>,<0,108.1,0>,34.5 }
  415.         cylinder{<0,90,0>,<0,120,0>,30}
  416.         plane{-z,0 rotate y*(30-90)}
  417.         plane{-z,0 rotate -y*(30-90)}
  418.         texture{texcastle rotate x*90}
  419.         }
  420. #declare piezahue=union{
  421.         object{pieza1 }
  422.         object{pieza2 }
  423. }
  424. //pieza usada para crear la base redonda de la torre
  425. #declare piezacir60=difference{
  426.     sphere{<0,0,0>,30}
  427.     plane {-y,0}
  428.     plane{-z,0 rotate y*(30-90)}
  429.     plane{-z,0 rotate -y*(30-90)}
  430.     texture{texcastle}
  431. }
  432.  
  433. #declare torcol1=union{         // torre colgante redondeada
  434.     union{
  435.         #declare ngra=0
  436.         #while (ngra<331)
  437.             object{piezacir60 rotate y*ngra }
  438.             #declare ngra=ngra+30
  439.         #end    
  440.         translate <0,60,0>
  441.     }
  442.  
  443.     difference{
  444.         union{
  445.             #declare ngra=0
  446.             #while (ngra<331)
  447.                 object{piezacil60 rotate y*ngra }
  448.                 #declare ngra=ngra+30
  449.             #end    
  450.             }
  451.         object{recven1 translate <0,70,-31>}
  452.         object{recven1 translate <0,70,-31> rotate y*55}
  453.         object{recven1 translate <0,70,-31> rotate y*-55}
  454.     }
  455.     cylinder{<0,90,0>,<0,100,0>,30  
  456.              texture{texcastle1 rotate x*90}
  457.             }
  458. // ventanas
  459.     object{marcove1 translate <0,70,-28> texture{textmur1}}
  460.     object{marcove1 translate <0,70,-28> texture{textmur1} rotate y*55}
  461.     object{marcove1 translate <0,70,-28> texture{textmur1} rotate y*-55}
  462.  
  463. // aqui va la banda lateral donde iran las aspilleras
  464.     difference{
  465.         union{
  466.             #declare ngra=0
  467.             #while (ngra<331)
  468.                 object{piezahue rotate y*ngra }
  469.                 #declare ngra=ngra+30
  470.             #end    
  471.             }
  472.         union{
  473.         #declare nalm=0
  474.         #while (nalm!=6)
  475.          box{<-7,90,-40>,<7,110,22> rotate y*(nalm*60)}
  476.          #declare nalm=nalm+1
  477.         #end
  478.         rotate y*30
  479.         }
  480.     }
  481. // siguen las aspilleras propiamente dichas
  482.     union{
  483.         #declare nalm=0                  
  484.         #while (nalm!=6)
  485.          object{ aspilleraGt translate<0,100,-31> rotate y*(nalm*60)}
  486.          #declare nalm=nalm+1
  487.         #end
  488.         rotate y*30
  489.         }
  490. }                  
  491.  
  492.  
  493. #declare ristra5=union{
  494.     object{ aspilleraG translate<-12.5,0,0>}
  495.     object{ aspilleraG translate<12.5,0,0>}
  496. }
  497. #declare soporte0=intersection{
  498.         difference{
  499.             box{<-4,30,-27>,<4,60,40>}
  500.             sphere{<0,25,-30>,30}
  501.             }
  502.         sphere{<0,25,-30>,35}
  503.         texture{T17 scale<10,10,10>}
  504.         }
  505. #declare soporte1=union{
  506.         box{<-28,55,-28>,<28,60,-24>}   // viga-soporte
  507.         box{<-28,55,-14>,<28,60,-10>}   // viga-soporte
  508.         object{soporte0}
  509.         object{soporte0 translate <-20,0,0>}
  510.         object{soporte0 translate <20,0,0>}
  511.         texture{T17 scale<10,10,10>}
  512. }
  513. #declare torcol2=union{         // torre colgante de base rectangular
  514.     object{soporte1}            //base
  515.     box{<-24.8,95,-24.8>,<24.8,101,24.8> texture{texcastle1 rotate x*90}} 
  516.     difference{
  517.         box{<-24.8,60,-25>,<24.8,100,-20> texture{texcastle}}
  518.         object{recven1 translate <0,70,-25>}
  519.         }
  520.     difference{
  521.         box{<-24.8,60,-25>,<24.8,100,-20> texture{texcastle}}
  522.         object{recven1 translate <0,70,-25>}
  523.         rotate y*90
  524.         }
  525.     difference{
  526.         box{<-24.8,60,-25>,<24.8,100,-20> texture{texcastle}}
  527.         object{recven1 translate <0,70,-25>}
  528.         rotate y*-90
  529.         }
  530. // ventana
  531.     object{marcove1 translate <0,70,-24> texture{textmur1}}
  532.     object{marcove1 translate <0,70,-24> texture{textmur1} rotate y*90}
  533.     object{marcove1 translate <0,70,-24> texture{textmur1} rotate y*-90}
  534. // siguen las aspilleras propiamente dichas
  535.     union{
  536.         object {ristra5 translate <0,100,-25>}
  537.         object {ristra5 translate <0,100,-25> rotate y*90}
  538.         object {ristra5 translate <0,100,-25> rotate y*-90}
  539.         texture{textmur1}
  540.         }
  541. }                  
  542.  
  543. //#include "town.inc"
  544. #include "lateral.inc"      //versión recortada de town.inc
  545.  
  546. /* Debido a cuestiones de  velocidad,  las torres de tierra estan compuestas
  547.    por dos o mas secciones.  La altura de estas secciones sera siempre de  5
  548.    o 10 metros por lo que la altura total de una torre sera, al menos, de 15
  549.    mts.   Como  las  secciones (dentro del mismo ancho) son intercambiables,
  550.    obtendremos bastante variedad  para  las  torres  a  construir y podremos
  551.    añadir definiciones para secciones y torres nuevas  con  toda  facilidad.
  552.    Ademas,  al  ser  siempre  la altura multiplo de 5, podremos conectar las
  553.    torres con puentes y otras estructuras.
  554.    Las  secciones  pueden ser redondeadas o cuadradas y su anchura sera como
  555.    minimo de de 10.  Aparte de  esto  cada  sección debe ser de uno de estos
  556.    tipos: base (b), media (m) o final (f).  El  ancho  de  las  torres  sera
  557.    siempre  multiplo  de  5  (para  poder  conectarlas  mas  facilmente  con
  558.    murallas, puentes, etc).
  559.    Los  nombres  de  secciones  son  autoexplicativos:  secb10_5r  significa
  560.    sección  base  redondeada  de  10  metros  de  anchura * 5 de ancho.  Las
  561.    secciones estan huecas  y  tienen  techo  pero  no  suelo (se apilan unas
  562.    encima de otras).
  563.    Para cada tipo de torre  comenzamos  con  las declaraciones de recortes y
  564.    piezas.  Sigue la lista de secciones y, por ultimo, las declaraciones  de
  565.    torres construidas con las secciones definidas */
  566.    
  567. // declaraciones para PIEZAS DE SECCIONES CIRCULARES DE 10 METROS DE ANCHO
  568. //recortes de ventana de 10 de ancho
  569. #declare base=45            // angulo donde se pondra la primera ventana
  570. #declare pZ=-51             // pos. Z donde iran las ventanas (radio de torre)
  571. #declare angsum=90          // angulo de separacion entre cada ventana
  572. #declare clipw10r=union{
  573.     #while(base<360)
  574.      object{recven1 translate <0,0,pZ> rotate y*(base+angsum)}
  575.     #declare base=base+angsum
  576.     #end
  577.     texture{textmur1}
  578.     }
  579. //ventanas de la torre
  580. #declare base=45
  581. #declare makew10r=union{
  582.     #while(base<360)
  583.      object{marcove1 translate <0,0,pZ+3> rotate y*(base+angsum)}
  584.     #declare base=base+angsum
  585.     #end
  586.     texture{textmur1}
  587.     } 
  588. #declare piezacil10=difference{
  589.          cylinder{<0,0,0>,<0,100,0>,51 }
  590.          plane{-z,0 rotate y*(22.5-90)}
  591.          plane{-z,0 rotate -y*(22.5-90)}
  592.          cylinder{<0,-5,0>,<0,120,0>,42 }   //ancho del muro: 1 metro aprox.
  593.          texture{texcastle}
  594. }
  595. #declare cilindro10=union{
  596.     #declare ngra=0
  597.     #while (ngra<331)
  598.         object{piezacil10 rotate y*ngra }
  599.         #declare ngra=ngra+30
  600.     #end    
  601. }
  602.  
  603. // Sigue la LISTA DE SECCIONES para TORRES REDONDAS DE 10 metros de ancho
  604. // La base con una puerta en -Z
  605. #declare secb10_10r=union{
  606.     difference {
  607.         object{cilindro10}
  608. // el recorte para la puerta del lado Z-
  609.         object{recpuer1 translate<0,0,-51>}
  610. // siguen los recortes para las ventanas de esta torre
  611.         object{clipw10r translate <0,80,0>}
  612.         }
  613. // colocar la puerta de la base
  614.     object{puerta translate<0,0,-50>}
  615. // siguen los 4 marcos de los respiraderos
  616.     object{makew10r translate <0,80,0>}
  617. }
  618.  
  619. //la sección media siguiente se usa para obtener mas desigualdades de altura
  620. #declare secm10_5r=difference{
  621.         object{cilindro10}
  622.         box{<-60,50,-60>,<60,110,60>}
  623. }
  624.  
  625. // una sección media con ventanas
  626. #declare secm10_10r=union{
  627.     difference {
  628.         object{cilindro10}
  629. // siguen los recortes para las ventanas de esta torre
  630.         object{clipw10r translate <0,80,0>}
  631.         }
  632. // siguen los 4 marcos de los respiraderos
  633.     object{makew10r translate <0,80,0>}
  634. }
  635.  
  636. // una sección media con 4 torres colgantes torcol1
  637. #declare secm10_10r01=union{
  638.     object{cilindro10}
  639.     object{torcol1 translate<0,0,-50> }
  640.     object{torcol1 translate<0,0,-50> rotate y*90}
  641.     object{torcol1 translate<0,0,-50> rotate y*-90}
  642.     object{torcol1 translate<0,0,-50> rotate y*180}
  643.     }
  644.  
  645. // una sección media con 4 torres colgantes torcol2
  646. #declare secm10_10r02=union{
  647.     object{cilindro10}
  648.     object{torcol2 translate<0,0,-56> }
  649.     object{torcol2 translate<0,0,-56> rotate y*90}
  650.     object{torcol2 translate<0,0,-56> rotate y*-90}
  651.     object{torcol2 translate<0,0,-56> rotate y*180}
  652.     }
  653.  
  654. // una sección media con 4 puertas
  655. #declare secm10_10r03=union{
  656.     difference {
  657.         object{cilindro10}
  658.         object{recpuer1 translate<0,0,-51> }
  659.         object{recpuer1 translate<0,0,-51> rotate y*90}
  660.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  661.         object{recpuer1 translate<0,0,-51> rotate y*180}
  662.         }        
  663.     object{puerta translate<0,0,-50> }
  664.     object{puerta translate<0,0,-50> rotate y*90} 
  665.     object{puerta translate<0,0,-50> rotate y*-90}
  666.     object{puerta translate<0,0,-50> rotate y*180}
  667.     }
  668.  
  669. // sección media con 4 colgantes de tipo 1 y 2
  670. #declare secm10_10r04=union{
  671.     object{cilindro10}
  672.     object{colgante1 translate<0,0,-56> }
  673.     object{colgante2 translate<0,0,-56> rotate y*90}
  674.     object{colgante1 translate<0,0,-56> rotate y*-90}
  675.     object{colgante2 translate<0,0,-56> rotate y*180}
  676.     }
  677.  
  678. // sigue declar. de SECCION CIMA BASICA de 5 de alto
  679. #declare piezat1=difference{
  680.         cylinder{<0,50,0>,<0,58,0>,54.5 }
  681.         cylinder{<0,45,0>,<0,60,0>,50}
  682.         plane{-z,0 rotate y*(30-90)}
  683.         plane{-z,0 rotate -y*(30-90)}
  684.         texture{texcastle}
  685.         }
  686. #declare piezat2=difference{
  687.         cylinder{<0,58,0>,<0,58.1,0>,54.5 }
  688.         cylinder{<0,45,0>,<0,60,0>,50}
  689.         plane{-z,0 rotate y*(30-90)}
  690.         plane{-z,0 rotate -y*(30-90)}
  691.         texture{texcastle rotate x*90}
  692.         }
  693. #declare piezahue1=union{
  694.         object{piezat1 }
  695.         object{piezat2 }
  696. }
  697. #declare secf10_5r=union{
  698.     difference {        // cuerpo central
  699.         object{cilindro10}
  700.         box{<-60,45,-60>,<60,110,60>}
  701.         }
  702. // el techo de la torre
  703.     cylinder{<0,45,0>,<0,50,0>,51 texture{texcastle2 rotate x*90}}
  704. // la portilla superior
  705.     object{portilla translate <0,45,0>}
  706. // aqui va la banda lateral donde iran las aspilleras
  707.     difference{
  708.         union{
  709.             #declare ngra=0
  710.             #while (ngra<331)
  711.                 object{piezahue1 rotate y*ngra }
  712.                 #declare ngra=ngra+30
  713.             #end    
  714.             }
  715.         union{
  716.         #declare nalm=0
  717.         #while (nalm!=10)
  718.          box{<-7,50,-60>,<7,60,32> rotate y*(nalm*36)}
  719.          #declare nalm=nalm+1
  720.         #end
  721.         rotate y*30
  722.         }
  723.     }
  724. // siguen las aspilleras propiamente dichas
  725.     union{
  726.         #declare nalm=0                  
  727.         #while (nalm!=10)
  728.          object{ aspilleraGt translate<0,50,-51> rotate y*(nalm*36)}
  729.          #declare nalm=nalm+1
  730.         #end
  731.         rotate y*30
  732.         }
  733. }                  
  734.  
  735. // Casos mas frecuentes para la cima anterior
  736. // esta torre tiene 2 puertas, en los lados X+ y X-,  porque  tiene  muro  a
  737. // ambos lados.
  738. #declare secf10_5r01=union{
  739.     difference{
  740.         object{secf10_5r}
  741.         object{recpuer1 translate<0,0,-51> rotate y*90}
  742.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  743.         }        
  744.     object{puerta translate<0,0,-50> rotate y*90} 
  745.     object{puerta translate<0,0,-50> rotate y*-90}
  746.     }
  747.     
  748. // puerta en X+ y en Z-
  749. #declare secf10_5r02=union{
  750.     difference{
  751.         object{secf10_5r}
  752.         object{recpuer1 translate<0,0,-51> rotate y*180}
  753.         object{recpuer1 translate<0,0,-51> rotate y*90}
  754.         }        
  755.     object{puerta translate<0,0,-50> rotate y*180}
  756.     object{puerta translate<0,0,-50> rotate y*90}
  757.     }
  758.  
  759. // puerta en X- y en Z-
  760. #declare secf10_5r03=union{
  761.     difference{
  762.         object{secf10_5r}
  763.         object{recpuer1 translate<0,0,-51> rotate y*180}
  764.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  765.         }        
  766.     object{puerta translate<0,0,-50> rotate y*180}
  767.     object{puerta translate<0,0,-50> rotate y*-90}
  768.     }
  769.  
  770. // en esta sección hay tres puertas (en la de Z habra una escal. u otro        
  771. // muro
  772. #declare secf10_5r04=union{
  773.     difference{
  774.         object{secf10_5r}
  775.         object{recpuer1 translate<0,0,-51> }
  776.         object{recpuer1 translate<0,0,-51> rotate y*90}
  777.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  778.         }        
  779.     object{puerta translate<0,0,-50> }
  780.     object{puerta translate<0,0,-50> rotate y*90}
  781.     object{puerta translate<0,0,-50> rotate y*-90}
  782.     }
  783. //4 puertas (por torres colgantes en la sección inferior)
  784. #declare secf10_5r05=union{
  785.     difference{
  786.         object{secf10_5r}
  787.         object{recpuer1 translate<0,0,-51> }
  788.         object{recpuer1 translate<0,0,-51> rotate y*90}
  789.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  790.         object{recpuer1 translate<0,0,-51> rotate y*180}
  791.         }        
  792.     object{puerta translate<0,0,-50> }
  793.     object{puerta translate<0,0,-50> rotate y*90}
  794.     object{puerta translate<0,0,-50> rotate y*-90}
  795.     object{puerta translate<0,0,-50> rotate y*180}
  796.     }
  797.  
  798.  
  799. /*      EJEMPLOS DE TORRES CIRCULARES DE 10 METROS DE ANCHO
  800. //Torre de "muralla de 10 de alto" con dos puertas en X+ y X-, sobre esta
  801. #declare TORRE15_10r1=union{
  802.     object{secb10_10r}
  803.     object{secf10_5r01 translate<0,100,0>}
  804.     }
  805. //idem. con puertas en X+ y Z- (en una esquina, sobre la muralla)
  806. #declare TORRE15_10r2=union{
  807.     object{secb10_10r}
  808.     object{secf10_5r02 translate<0,110,0>}
  809.     }
  810. //idem. con puertas en X- y Z- (la esquina opuesta de la muralla)
  811. #declare TORRE15_10r3=union{
  812.     object{secb10_10r}
  813.     object{secf10_5r03 translate<0,100,0>}
  814.     }
  815. // idem. con 3 puertas sobre la muralla (X-, X+ y Z-, donde habra una escal.
  816. // u otro muro
  817. #declare TORRE15_10r4=union{
  818.     object{secb10_10r}
  819.     object{secf10_5r04 translate<0,100,0>}
  820.     }
  821. // Torre utilizada como puesto de vigia (suele ir encima de otras)
  822. #declare TORRE25_10v=union{
  823.     object{secb10_10r}
  824.     object{secm10_10r translate<0,100,0>}
  825.     object{secf10_5r translate<0,200,0>}
  826.     }
  827.  
  828. // Torre vigia con tres torres colgantes torcol1 (suele ir pegada a otras)
  829. #declare TORRE25_10v1=union{
  830.     object{secb10_10r}
  831.     object{secm10_10r01 translate<0,100,0>}
  832.     object{secf10_5r04 translate<0,200,0>}
  833.     }
  834.  
  835. // Torre vigia con tres torres colgantes torcol2
  836. #declare TORRE25_10v2=union{
  837.     object{secb10_10r}
  838.     object{secm10_10r02 translate<0,100,0>}
  839.     object{secf10_5r04 translate<0,200,0>}
  840.     }
  841. */
  842.  
  843.  
  844. // ======================================================================
  845. // declaraciones para PIEZAS DE SECCIONES CIRCULARES DE 20 METROS DE ANCHO
  846. //recortes de ventana de 10 de ancho
  847. #declare base=22.5          // angulo donde se pondra la primera ventana
  848. #declare pZ=-51             // pos. Z donde iran las ventanas (radio de torre)
  849. #declare angsum=45          // angulo de separacion entre cada ventana
  850. #declare clipw20r=union{
  851.     #while(base<360)
  852.      object{recven1 translate <0,0,pZ> rotate y*(base+angsum)}
  853.     #declare base=base+angsum
  854.     #end
  855.     texture{textmur1}
  856.     }
  857. //ventanas de la torre
  858. #declare base=22.5
  859. #declare makew20r=union{
  860.     #while(base<360)
  861.      object{marcove1 translate <0,0,pZ+3> rotate y*(base+angsum)}
  862.     #declare base=base+angsum
  863.     #end
  864.     texture{textmur1}
  865.     } 
  866. #declare piezacil20=difference{
  867.          cylinder{<0,0,0>,<0,100,0>,101 }
  868.          plane{-z,0 rotate y*(22.5-90)}
  869.          plane{-z,0 rotate -y*(22.5-90)}
  870.          cylinder{<0,5,0>,<0,120,0>,92 }
  871.          texture{texcastle}
  872. }
  873. #declare cilindro20=union{
  874.     #declare ngra=0
  875.     #while (ngra<331)
  876.         object{piezacil20 rotate y*ngra }
  877.         #declare ngra=ngra+30
  878.     #end    
  879. }
  880.  
  881. // Sigue la LISTA DE SECCIONES para TORRES REDONDAS DE 20 metros de ancho
  882. // La base con una puerta en -Z
  883. #declare secb20_10r=union{
  884.     difference {
  885.         object{cilindro20}
  886. // el recorte para la puerta del lado Z-
  887.         object{recpuer1 translate<0,0,-101>}
  888. // siguen los recortes para las ventanas de esta torre
  889.         object{clipw20r translate <0,80,0>}
  890.         }
  891. // colocar la puerta de la base
  892.     object{puerta translate<0,0,-100>}
  893. // siguen los 4 marcos de los respiraderos
  894.     object{makew20r translate <0,80,0>}
  895. }
  896.  
  897. // una sección media con ventanas
  898. #declare secm20_10r=union{
  899.     difference {
  900.         object{cilindro20}
  901. // siguen los recortes para las ventanas de esta torre
  902.         object{clipw20r translate <0,80,0>}
  903.         }
  904. // siguen los 4 marcos de los respiraderos
  905.     object{makew20r translate <0,80,0>}
  906. }
  907.  
  908. // una sección media con 4 torres colgantes torcol1
  909. #declare secm20_10r01=union{
  910.     object{cilindro20}
  911.     object{torcol1 translate<0,0,-100> }
  912.     object{torcol1 translate<0,0,-100> rotate y*90}
  913.     object{torcol1 translate<0,0,-100> rotate y*-90}
  914.     object{torcol1 translate<0,0,-100> rotate y*180}
  915.     }
  916.  
  917. // una sección media con 4 torres colgantes torcol2
  918. #declare secm20_10r02=union{
  919.     object{cilindro20}
  920.     object{torcol2 translate<0,0,-106> }
  921.     object{torcol2 translate<0,0,-106> rotate y*90}
  922.     object{torcol2 translate<0,0,-106> rotate y*-90}
  923.     object{torcol2 translate<0,0,-106> rotate y*180}
  924.     }
  925.  
  926. // una sección media con 4 puertas
  927. #declare secm20_10r03=union{
  928.     difference {
  929.         object{cilindro20}
  930.         object{recpuer1 translate<0,0,-101> }
  931.         object{recpuer1 translate<0,0,-101> rotate y*90}
  932.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  933.         object{recpuer1 translate<0,0,-101> rotate y*180}
  934.         }        
  935.     object{puerta translate<0,0,-100> }
  936.     object{puerta translate<0,0,-100> rotate y*90} 
  937.     object{puerta translate<0,0,-100> rotate y*-90}
  938.     object{puerta translate<0,0,-100> rotate y*180}
  939.     }
  940.  
  941. // sigue declar. basica de sección cima de 5 de alto
  942. #declare piezato1=difference{
  943.         cylinder{<0,50,0>,<0,58,0>,104.5 }
  944.         cylinder{<0,45,0>,<0,60,0>,100}
  945.         plane{-z,0 rotate y*(30-90)}
  946.         plane{-z,0 rotate -y*(30-90)}
  947.         texture{texcastle}
  948.         }
  949. #declare piezato2=difference{
  950.         cylinder{<0,58,0>,<0,58.1,0>,104.5 }
  951.         cylinder{<0,45,0>,<0,60,0>,100}
  952.         plane{-z,0 rotate y*(30-90)}
  953.         plane{-z,0 rotate -y*(30-90)}
  954.         texture{texcastle rotate x*90}
  955.         }
  956. #declare piezahuec1=union{
  957.         object{piezato1 }
  958.         object{piezato2 }
  959. }
  960. #declare secf20_5r=union{
  961.     difference {        // cuerpo central
  962.         object{cilindro20}
  963.         box{<-110,45,-110>,<110,110,110>}
  964.         }
  965. // el techo de la torre
  966.     cylinder{<0,45,0>,<0,50,0>,101 texture{texcastle2 rotate x*90}}
  967. // la portilla superior
  968.     object{portilla translate <0,45,0>}
  969. // aqui va la banda lateral donde iran las aspilleras
  970.     difference{
  971.         union{
  972.             #declare ngra=0
  973.             #while (ngra<331)
  974.                 object{piezahuec1 rotate y*ngra }
  975.                 #declare ngra=ngra+30
  976.             #end    
  977.             }
  978.         union{
  979.         #declare nalm=0
  980.         #while (nalm!=20)
  981.          box{<-7,50,-110>,<7,60,90> rotate y*(nalm*18)}
  982.          #declare nalm=nalm+1
  983.         #end
  984.         rotate y*30
  985.         }
  986.     }
  987. // siguen las aspilleras propiamente dichas
  988.     union{
  989.         #declare nalm=0                  
  990.         #while (nalm!=20)
  991.          object{ aspilleraGt translate<0,50,-101> rotate y*(nalm*18)}
  992.          #declare nalm=nalm+1
  993.         #end
  994.         rotate y*30
  995.         }
  996. }                  
  997.  
  998. // Casos mas frecuentes para la cima anterior
  999. // esta torre tiene 2 puertas, en los lados X+ y X-,  porque  tiene  muro  a
  1000. // ambos lados.
  1001. #declare secf20_5r01=union{
  1002.     difference{
  1003.         object{secf20_5r}
  1004.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1005.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  1006.         }        
  1007.     object{puerta translate<0,0,-100> rotate y*90} 
  1008.     object{puerta translate<0,0,-100> rotate y*-90}
  1009.     }
  1010.     
  1011. // puerta en X+ y en Z-
  1012. #declare secf20_5r02=union{
  1013.     difference{
  1014.         object{secf20_5r}
  1015.         object{recpuer1 translate<0,0,-101> rotate y*180}
  1016.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1017.         }        
  1018.     object{puerta translate<0,0,-100> rotate y*180}
  1019.     object{puerta translate<0,0,-100> rotate y*90}
  1020.     }
  1021.  
  1022. // puerta en X- y en Z-
  1023. #declare secf20_5r03=union{
  1024.     difference{
  1025.         object{secf20_5r}
  1026.         object{recpuer1 translate<0,0,-101> rotate y*180}
  1027.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  1028.         }        
  1029.     object{puerta translate<0,0,-100> rotate y*180}
  1030.     object{puerta translate<0,0,-100> rotate y*-90}
  1031.     }
  1032.  
  1033. // en esta sección hay tres puertas (en la de Z habra una escal. u otro        
  1034. // muro
  1035. #declare secf20_5r04=union{
  1036.     difference{
  1037.         object{secf20_5r}
  1038.         object{recpuer1 translate<0,0,-101> }
  1039.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1040.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  1041.         }        
  1042.     object{puerta translate<0,0,-100> }
  1043.     object{puerta translate<0,0,-100> rotate y*90}
  1044.     object{puerta translate<0,0,-100> rotate y*-90}
  1045.     }
  1046. #declare secf20_5r05=union{
  1047.     difference{
  1048.         object{secf20_5r}
  1049.         object{recpuer1 translate<0,0,-101> }
  1050.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1051.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  1052.         object{recpuer1 translate<0,0,-101> rotate y*180}
  1053.         }        
  1054.     object{puerta translate<0,0,-100> }
  1055.     object{puerta translate<0,0,-100> rotate y*90}
  1056.     object{puerta translate<0,0,-100> rotate y*-90}
  1057.     object{puerta translate<0,0,-100> rotate y*180}
  1058.     }
  1059.  
  1060. //             TORRES CIRCULARES DE 20 METROS DE ANCHO
  1061. #declare TORRE25_20r1=union{
  1062.     object{secb20_10r}
  1063.     object{secm20_10r02 translate<0,100,0>}
  1064.     object{secf20_5r01 translate<0,200,0>}
  1065.     }
  1066.  
  1067.  
  1068.  
  1069.  
  1070. // TORRES CUADRADAS DE 10 METROS DE DIAMETRO
  1071. // recorte y pegado de ventanas para torre cuadrada de 10 metros de ancho
  1072. #declare pZ=-50
  1073. #declare nv=0               // contador de ventanas
  1074. #declare numv=2             // num. de ventanas a poner
  1075. #declare separ=60           // separación entre ventanas
  1076. #declare baseX=-30          // pos. X de primera ventana
  1077. #declare clipw10c=union{
  1078.     #while(nv<numv)
  1079.     object{recven1 translate <baseX+(nv*separ),0,pZ>}
  1080.     object{recven1 translate <baseX+(nv*separ),0,pZ> rotate y*90}
  1081.     object{recven1 translate <baseX+(nv*separ),0,pZ> rotate y*180}
  1082.     object{recven1 translate <baseX+(nv*separ),0,pZ> rotate y*270}
  1083.     #declare nv=nv+1
  1084.     #end
  1085.     }
  1086. #declare nv=0
  1087. #declare numv=2
  1088. #declare separ=60
  1089. #declare baseX=-30
  1090. #declare makew10c=union{
  1091.     #while(nv<numv)
  1092.     object{marcove1 translate <baseX+(nv*separ),0,pZ+3>}
  1093.     object{marcove1 translate <baseX+(nv*separ),0,pZ+3> rotate y*90}
  1094.     object{marcove1 translate <baseX+(nv*separ),0,pZ+3> rotate y*180}
  1095.     object{marcove1 translate <baseX+(nv*separ),0,pZ+3> rotate y*270}
  1096.     #declare nv=nv+1
  1097.     #end
  1098.     }
  1099.  
  1100. // Sigue la LISTA DE SECCIONES para TORRES CUADRADAS DE 10 metros de ancho
  1101. #declare secbacu10=union{   //seccion basica de 10*10 metros
  1102.     box{<-49.8,0,-50>,<49.8,100,-49> texture{texcastle}}
  1103.     box{<-49.8,0,-50>,<49.8,100,-49> texture{texcastle} rotate y*90}
  1104.     box{<-49.8,0,-50>,<49.8,100,-49> texture{texcastle} rotate y*-90}
  1105.     box{<-49.8,0,-50>,<49.8,100,-49> texture{texcastle} rotate y*180}
  1106. }
  1107. //sigue una sección basica usada para conseguir mas desigualdades de alturas
  1108. #declare secbacu10_5=union{
  1109.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle}}
  1110.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*90}
  1111.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*-90}
  1112.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*180}
  1113. }
  1114.  
  1115. // La base con una puerta en -Z
  1116. #declare secb10_10c=union{
  1117.     difference {
  1118.         object{secbacu10}
  1119. // el recorte para la puerta del lado Z-
  1120.         object{recpuer1 translate<0,0,-51>}
  1121. // siguen los recortes para las ventanas de esta torre
  1122.         object{clipw10c translate <0,80,0>}
  1123.         }
  1124. // colocar la puerta de la base
  1125.     object{puerta translate<0,0,-50>}
  1126. // siguen los 4 marcos de los respiraderos
  1127.     object{makew10c translate <0,80,0>}
  1128. }
  1129.  
  1130. // una sección media con ventanas
  1131. #declare secm10_10c=union{
  1132.     difference {
  1133.         object{secbacu10}
  1134. // siguen los recortes para las ventanas de esta torre
  1135.         object{clipw10c translate <0,80,0>}
  1136.         }
  1137. // siguen los 4 marcos de los respiraderos
  1138.     object{makew10c translate <0,80,0>}
  1139. }
  1140.  
  1141. // una sección media con 4 torres colgantes torcol1
  1142. #declare secm10_10c01=union{
  1143.     object{secbacu10}
  1144.     object{torcol1 translate<0,0,-50> }
  1145.     object{torcol1 translate<0,0,-50> rotate y*90}
  1146.     object{torcol1 translate<0,0,-50> rotate y*-90}
  1147.     object{torcol1 translate<0,0,-50> rotate y*180}
  1148.     }
  1149.  
  1150. // una sección media con 4 torres colgantes torcol2
  1151. #declare secm10_10c02=union{
  1152.     object{secbacu10}
  1153.     object{torcol2 translate<0,0,-56> }
  1154.     object{torcol2 translate<0,0,-56> rotate y*90}
  1155.     object{torcol2 translate<0,0,-56> rotate y*-90}
  1156.     object{torcol2 translate<0,0,-56> rotate y*180}
  1157.     }
  1158.  
  1159. // una sección media con 4 puertas
  1160. #declare secm10_10c03=union{
  1161.     difference {
  1162.         object{secbacu10}
  1163.         object{recpuer1 translate<0,0,-51> }
  1164.         object{recpuer1 translate<0,0,-51> rotate y*90}
  1165.         object{recpuer1 translate<0,0,-51> rotate y*180}
  1166.         object{recpuer1 translate<0,0,-51> rotate y*270}
  1167.         }        
  1168.     object{puerta translate<0,0,-50> }
  1169.     object{puerta translate<0,0,-50> rotate y*90} 
  1170.     object{puerta translate<0,0,-50> rotate y*180}
  1171.     object{puerta translate<0,0,-50> rotate y*270}
  1172.     }
  1173. // sección media con 4 colgantes del tipo 1 y 2
  1174. #declare secm10_10c04=union{
  1175.     object{secbacu10}
  1176.     object{colgante1 translate<0,0,-56> }
  1177.     object{colgante2 translate<0,0,-56> rotate y*90}
  1178.     object{colgante1 translate<0,0,-56> rotate y*-90}
  1179.     object{colgante2 translate<0,0,-56> rotate y*180}
  1180.     }
  1181.  
  1182. // sigue declar. de SECCION CIMA BASICA de 5 de alto
  1183. #declare secf10_5c=union{
  1184. //paredes
  1185.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle}}
  1186.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*90}
  1187.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*-90}
  1188.     box{<-49.8,0,-50>,<49.8,50,-49> texture{texcastle} rotate y*180}
  1189. //techo
  1190.     box{<-49.8,45,-49.8>,<49.8,50,49.8> texture{texcastle2 rotate x*90}} 
  1191. // la portilla superior
  1192.     object{portilla translate <0,45,0>}
  1193. // siguen las aspilleras
  1194.     union{
  1195.         object {ristra10 translate <0,50,-50>}
  1196.         object {ristra10 translate <0,50,-50> rotate y*90}
  1197.         object {ristra10 translate <0,50,-50> rotate y*-90}
  1198.         object {ristra10 translate <0,50,-50> rotate y*180}
  1199.         }
  1200. }
  1201.  
  1202.  
  1203. // Casos mas frecuentes para la cima anterior
  1204. // esta torre tiene 2 puertas, en los lados X+ y X-,  porque  tiene  muro  a
  1205. // ambos lados.
  1206. #declare secf10_5c01=union{
  1207.     difference{
  1208.         object{secf10_5c}
  1209.         object{recpuer1 translate<0,0,-51> rotate y*90}
  1210.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  1211.         }        
  1212.     object{puerta translate<0,0,-50> rotate y*90} 
  1213.     object{puerta translate<0,0,-50> rotate y*-90}
  1214.     }
  1215.     
  1216. // puerta en X+ y en Z-
  1217. #declare secf10_5c02=union{
  1218.     difference{
  1219.         object{secf10_5c}
  1220.         object{recpuer1 translate<0,0,-51> rotate y*180}
  1221.         object{recpuer1 translate<0,0,-51> rotate y*90}
  1222.         }        
  1223.     object{puerta translate<0,0,-50> rotate y*180}
  1224.     object{puerta translate<0,0,-50> rotate y*90}
  1225.     }
  1226.  
  1227. // puerta en X- y en Z-
  1228. #declare secf10_5c03=union{
  1229.     difference{
  1230.         object{secf10_5c}
  1231.         object{recpuer1 translate<0,0,-51> rotate y*180}
  1232.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  1233.         }        
  1234.     object{puerta translate<0,0,-50> rotate y*180}
  1235.     object{puerta translate<0,0,-50> rotate y*-90}
  1236.     }
  1237.  
  1238. // en esta sección hay tres puertas (en la de Z habra una escal. u otro        
  1239. // muro
  1240. #declare secf10_5c04=union{
  1241.     difference{
  1242.         object{secf10_5c}
  1243.         object{recpuer1 translate<0,0,-51> }
  1244.         object{recpuer1 translate<0,0,-51> rotate y*90}
  1245.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  1246.         }        
  1247.     object{puerta translate<0,0,-50> }
  1248.     object{puerta translate<0,0,-50> rotate y*90}
  1249.     object{puerta translate<0,0,-50> rotate y*-90}
  1250.     }
  1251.  
  1252. // en esta sección hay 4 puertas (hay torres colgantes)        
  1253. #declare secf10_5c05=union{
  1254.     difference{
  1255.         object{secf10_5c}
  1256.         object{recpuer1 translate<0,0,-51> }
  1257.         object{recpuer1 translate<0,0,-51> rotate y*90}
  1258.         object{recpuer1 translate<0,0,-51> rotate y*-90}
  1259.         object{recpuer1 translate<0,0,-51> rotate y*180}
  1260.         }        
  1261.     object{puerta translate<0,0,-50> }
  1262.     object{puerta translate<0,0,-50> rotate y*90}
  1263.     object{puerta translate<0,0,-50> rotate y*-90}
  1264.     object{puerta translate<0,0,-50> rotate y*180}
  1265.     }
  1266.  
  1267.  
  1268.  
  1269.  
  1270.  
  1271. //       SECCIONES PARA TORRES CUADRADAS DE 20 METROS DE ANCHO
  1272. // (estas torres no tienen ventanas porque siempre estan rodeadas de
  1273. // otras torres mas pequeñas).
  1274. #declare secbacu20=union{   //seccion basica de 10*10 metros
  1275.     box{<-99.8,0,-50>,<99.8,100,-99> texture{texcastle}}
  1276.     box{<-99.8,0,-50>,<99.8,100,-99> texture{texcastle} rotate y*90}
  1277.     box{<-99.8,0,-50>,<99.8,100,-99> texture{texcastle} rotate y*-90}
  1278.     box{<-99.8,0,-50>,<99.8,100,-99> texture{texcastle} rotate y*180}
  1279. }
  1280.  
  1281. // La base con una puerta en -Z
  1282. #declare secb20_10c=union{
  1283.     difference {
  1284.         object{secbacu20}
  1285. // el recorte para la puerta del lado Z-
  1286.         object{recpuer1 translate<0,0,-101>}
  1287.         }
  1288. // colocar la puerta de la base
  1289.     object{puerta translate<0,0,-50>}
  1290. }
  1291.  
  1292. // una sección media con 4 torres colgantes torcol1
  1293. #declare secm20_10c01=union{
  1294.     object{secbacu20}
  1295.     object{torcol1 translate<0,0,-100> }
  1296.     object{torcol1 translate<0,0,-100> rotate y*90}
  1297.     object{torcol1 translate<0,0,-100> rotate y*-90}
  1298.     object{torcol1 translate<0,0,-100> rotate y*180}
  1299.     }
  1300.  
  1301. // una sección media con 4 torres colgantes torcol2
  1302. #declare secm20_10c02=union{
  1303.     object{secbacu20}
  1304.     object{torcol2 translate<0,0,-106> }
  1305.     object{torcol2 translate<0,0,-106> rotate y*90}
  1306.     object{torcol2 translate<0,0,-106> rotate y*-90}
  1307.     object{torcol2 translate<0,0,-106> rotate y*180}
  1308.     }
  1309.  
  1310. // una sección media con 4 puertas
  1311. #declare secm20_10c03=union{
  1312.     difference {
  1313.         object{secbacu20}
  1314.         object{recpuer1 translate<0,0,-101> }
  1315.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1316.         object{recpuer1 translate<0,0,-101> rotate y*180}
  1317.         object{recpuer1 translate<0,0,-101> rotate y*270}
  1318.         }        
  1319.     object{puerta translate<0,0,-100> }
  1320.     object{puerta translate<0,0,-100> rotate y*90} 
  1321.     object{puerta translate<0,0,-100> rotate y*180}
  1322.     object{puerta translate<0,0,-100> rotate y*270}
  1323.     }
  1324.  
  1325. #declare ristra20=union{
  1326.     #declare cal=0
  1327.     #declare xa=-87.5
  1328.     #while(cal!=8)
  1329.      object{ aspilleraG translate<xa,0,0>}
  1330.      #declare cal=cal+1
  1331.      #declare xa=xa+25
  1332.     #end
  1333.     }
  1334. // sigue declar. de SECCION CIMA BASICA de 5 de alto
  1335. #declare secf20_5c=union{
  1336. //paredes
  1337.     box{<-99.8,0,-100>,<99.8,50,-99> texture{texcastle}}
  1338.     box{<-99.8,0,-100>,<99.8,50,-99> texture{texcastle} rotate y*90}
  1339.     box{<-99.8,0,-100>,<99.8,50,-99> texture{texcastle} rotate y*-90}
  1340.     box{<-99.8,0,-100>,<99.8,50,-99> texture{texcastle} rotate y*180}
  1341. //techo
  1342.     box{<-99.8,45,-99.8>,<99.8,50,99.8> texture{texcastle2} rotate x*90}
  1343. // la portilla superior
  1344.     object{portilla translate <0,45,0>}
  1345. // siguen las aspilleras
  1346.     union{
  1347.         object {ristra20 translate <0,50,-100>}
  1348.         object {ristra20 translate <0,50,-100> rotate y*90}
  1349.         object {ristra20 translate <0,50,-100> rotate y*-90}
  1350.         object {ristra20 translate <0,50,-100> rotate y*180}
  1351.         }
  1352. }
  1353. // Casos mas frecuentes para la cima anterior
  1354. // en esta sección hay 4 puertas (hay torres colgantes)        
  1355. #declare secf20_5c05=union{
  1356.     difference{
  1357.         object{secf20_5c}
  1358.         object{recpuer1 translate<0,0,-101> }
  1359.         object{recpuer1 translate<0,0,-101> rotate y*90}
  1360.         object{recpuer1 translate<0,0,-101> rotate y*-90}
  1361.         object{recpuer1 translate<0,0,-101> rotate y*180}
  1362.         }        
  1363.     object{puerta translate<0,0,-100> }
  1364.     object{puerta translate<0,0,-100> rotate y*90}
  1365.     object{puerta translate<0,0,-100> rotate y*-90}
  1366.     object{puerta translate<0,0,-100> rotate y*180}
  1367.     }
  1368.  
  1369.  
  1370.  
  1371.  
  1372. /* UN EJEMPLO DE UN CASTILLO
  1373. //torre redonda de 10 ancho*25 de alto con ventanas usada en torbala
  1374. #declare torred25=union{ 
  1375.     object{secb10_10r}
  1376.     object{secm10_10r translate<0,100,0>}
  1377.     object{secf10_5r translate<0,200,0>}
  1378. }
  1379. //torre cuadrada de 15 de alto usada en torbala
  1380. #declare torcua15=union{
  1381.     object{secb10_10c}
  1382.     object{secf10_5c translate<0,100,0>}
  1383. }    
  1384. //torre base lateral de la estructura principal
  1385. #declare torbala=union{
  1386.     object{secb20_10r rotate y*90}
  1387.     object{secm20_10r translate<0,100,0>}      //ventanas
  1388.     object{secm20_10r01 translate<0,200,0> rotate y*45}    //con torcol1
  1389.     object{secf20_5r05 translate<0,300,0> rotate y*45}     //techo con 4 puertas
  1390. //se añaden 4 torres torred25 en las esquinas
  1391.     object{torred25 translate<-100,0,0>}
  1392.     object{torred25 translate<-100,0,0> rotate y*90}
  1393.     object{torred25 translate<-100,0,0> rotate y*-90}
  1394.     object{torred25 translate<-100,0,0> rotate y*180}
  1395. // se añaden 4 torres cuadradas intercaladas entre las torres redondas
  1396.     object{torcua15 translate<-110,0,0> rotate y*45}
  1397.     object{torcua15 translate<-110,0,0> rotate y*-45}
  1398.     object{torcua15 translate<-110,0,0> rotate y*(180+45)}
  1399.     object{torcua15 translate<-110,0,0> rotate y*-(180+45)}
  1400.     }
  1401.  
  1402. //torre redonda de 10 ancho*30 de alto con torres colgantes para intercalar
  1403. //entre torbalas
  1404. #declare torred30=union{ 
  1405.     object{secb10_10r}
  1406.     object{secm10_5r translate<0,100,0>}
  1407.     object{secm10_10r02 translate<0,150,0> rotate y*45}
  1408.     object{secf10_5r05 translate<0,250,0> rotate y*45}
  1409. }
  1410.  
  1411. //Ahora las definiciones para el grupo central de torres del castillo
  1412. //y laterales superiores
  1413. #declare torcua25=union{ //torres centinelas de base superior
  1414.     object{secb10_10c}
  1415.     object{secm10_10c01 translate <0,100,0>}
  1416.     object{secf10_5c05 translate <0,200,0>}
  1417. }
  1418. #declare torcua35=union{ //torres laterales de la estruc. superior princip.
  1419.     object{secb10_10c}
  1420.     object{secm10_10c translate<0,100,0>}
  1421.     object{secm10_10c04 translate <0,200,0>}
  1422.     object{secf10_5c05 translate <0,300,0>}
  1423. }
  1424. #declare torred15=union{
  1425.     object{secb10_10r}
  1426.     object{secf10_5r translate<0,100,0>}
  1427. }
  1428.  
  1429. #declare grupsup=union{
  1430.     object{secb20_10r }
  1431.     object{secm20_10r translate<0,100,0>}
  1432.     object{secm20_10r translate<0,200,0>}
  1433.     object{secm20_10r translate<0,300,0>}
  1434.     object{secf20_5r translate<0,400,0>}
  1435. //las 4 torres laterales del grupo superior
  1436.     object{torred15 translate<-85,0,-85>}
  1437.     object{torred15 translate<85,0,-85>}
  1438.     object{torred15 translate<85,0,-85>}
  1439.     object{torred15 translate<-85,0,85>}
  1440. //las 4 torres intercaladas de 20 metros de altura
  1441.     object{torcua35 translate<0,0,-120>}
  1442.     object{torcua35 translate<0,0,-120> rotate y*90}
  1443.     object{torcua35 translate<0,0,-120> rotate y*-90}
  1444.     object{torcua35 translate<0,0,-120> rotate y*180}
  1445.  
  1446. #declare ristra50=union{
  1447.     #declare cal=0
  1448. /* el valor inicial de xa se debe a que la aspillera esta centrada en 0 y va
  1449.     de  -12.50  a  12.50. Asi, si deseamos crear una ristra desde -250 a 250
  1450.     xa comenzara a 250-12.50=237.50. */
  1451.     #declare xa=-237.5
  1452.     #while(cal!=20)
  1453.      object{ aspilleraG translate<xa,0,0>}
  1454.      #declare cal=cal+1
  1455.      #declare xa=xa+25
  1456.     #end
  1457.     }
  1458. #declare body50_35=union{   //cuerpo cuadrado de 50 ancho*35 alto
  1459.     box{<-249.8,0,-250>,<249.8,400,-249> texture{texcastle}}
  1460.     box{<-249.8,0,-250>,<249.8,400,-249> texture{texcastle} rotate y*90}
  1461.     box{<-249.8,0,-250>,<249.8,400,-249> texture{texcastle} rotate y*-90}
  1462.     box{<-249.8,0,-250>,<249.8,400,-249> texture{texcastle} rotate y*180}
  1463. //techo
  1464.     box{<-249.8,399,-249.8>,<249.8,400,249.8> texture{texcastle1 rotate x*90}} 
  1465.     object{ristra50 translate<0,400,-250>}
  1466.     object{ristra50 translate<0,400,-250> rotate y*90}
  1467.     object{ristra50 translate<0,400,-250> rotate y*-90}
  1468.     object{ristra50 translate<0,400,-250> rotate y*180}
  1469. //4 torres laterales principales en las esquinas del castillo
  1470.     object{torbala translate<-250,0,-250>}
  1471.     object{torbala translate<250,0,-250>}
  1472.     object{torbala translate<-250,0,-250> rotate y*180}
  1473.     object{torbala translate<250,0,-250> rotate y*180}
  1474. //4 torres torred30 usadas entre las torres laterales de la base
  1475.     object{torred30 translate<0,0,-260>}
  1476.     object{torred30 translate<0,0,-260> rotate y*90}
  1477.     object{torred30 translate<0,0,-260> rotate y*-90}
  1478.     object{torred30 translate<0,0,-260> rotate y*180}
  1479. //sigue el grupo de torres superiores
  1480. //  object{grupsup translate<0,400,0>}
  1481. //y las 4 torres laterales superiores
  1482.     object{torcua25 translate<-240,350,-240>}
  1483.     object{torcua25 translate<-240,350,-240> rotate y*180}
  1484.     object{torcua25 translate<240,350,-240>}
  1485.     object{torcua25 translate<240,350,-240> rotate y*180}
  1486. } */
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.